@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `1  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu  } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED736 FREE SECTORS COPYING---D1:DIRECK.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 138ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8u ; RTL.ACT ; Copyright (c) 1986, Paul van de Graaf ; Permission is granted for members of ; Usenet & Arpanet to use this proT}gram. ; It is NOT to be distributed beyond ; Usenet & Arpanet sites; sold, or traded ; without consent of the author. SET $EU} = $4000 SET $491 = $4000 DEFINE R = "4", RW = "12", JMP = "$4C", EOL = "$9B", CLEAR = "125"V}, OPEN = "$03", PUTC = "$0B", CLOSE = "$0C" BYTE IC0CMD = $342, IC7CMD = $3B2, IC0AUX = $34A, IC7AUX =W} $3BA, IC0AUX2 = $34B, IC7AUX2 = $3BB, RAMSIZ = $2E4, RAMTOP = $6A CARD IC0BUF = $344, IC7BUF = $3B4, X}IC0BLEN = $348, IC7BLEN = $3B8 CHAR ARRAY editor = [ 'E ': EOL ], keybrd = [ 'K ': EOL ] PROC CIO = $E456(BYTE Y}Areg, Xreg) PROC Put(CHAR chr) IC0CMD = PUTC IC0BLEN = 0 CIO(chr,0) RETURN PROC Print(CHAR ARRAY msg) IC0CMD = Z}PUTC IC0BUF = msg + 1 IC0BLEN = msg(0) CIO(0,0) RETURN PROC main() BYTE POINTER ErrorAdr = Error IF RAMTOP >= $C0[} THEN IC0CMD = CLOSE CIO(0,0) ; Close(0) ; Bump down top of memory so the ; copy of the Action! cartrid\}ge ; won't clobber display memory. RAMTOP = $A0 RAMSIZ = $A0 IC0CMD = OPEN IC0BUF = editor IC0AUX = RW]} IC0AUX2 = 0 CIO(0,0) ; Open(0,"E:",RW,0) IC7CMD = OPEN IC7BUF = keybrd IC7AUX = R IC7AUX2 = 0 ^} CIO(0,$70) ; Open(7,"K:",R,0) ; Set up the Error Handler: ; On an Error, Action! jumps to ; the address E_}rror, which we ; set to contain a JMP $A3A2. ErrorAdr^ = JMP Error = $A3A2 ELSE Put(CLEAR) Print("The `}Home-Brew Action! ") Print(" Run-time Library") Print("requires at least 48K ") Print("bytes of memory.") Puta}(EOL) Put(EOL) Print("Please Remove Cartridge(s)!") DO OD ; Hang in a loop. FI RETURN --- CUT Hb}ERE --- ; FIXACT.ACT ; Copyright (c) 1986, Paul van de Graaf ; Permission is granted for members of ; Usenet & Arpanet to c}use this program. ; It is NOT to be distributed beyond ; Usenet & Arpanet sites; sold, or traded ; without consent of the autd}hor. SET $E = $4000 SET $491 = $4000 DEFINE NOP = "$EA", RTS = "$60" PROC main() ; Change STA $A04A in the ; multiple}y routine to NOPs. Poke($A036,NOP) Poke($A037,NOP) Poke($A038,NOP) ; Change JMP $B889 in the default ; error hf}andler to an RTS. Poke($A3A2,RTS) ; Change DEC $A395,X in the CIO ; error check routine to NOPs. Poke($A3BD,NOPg}) Poke($A3BE,NOP) Poke($A3BF,NOP) ; Change JSR $B8C2 and JMP $A339 ; in the PrintF() routine to NOPs. Poke($A4h}38,NOP) Poke($A439,NOP) Poke($A43A,NOP) Poke($A43B,NOP) Poke($A43C,NOP) Poke($A43D,NOP) ; Change STA ($A5),Y in thei} ; Close() routine to NOPs. Poke($B02A,NOP) Poke($B02B,NOP) RETURN --- CUT HERE --- ; CLEANUP.ACT ; Copyright (c) 19j}86, Paul van de Graaf ; Permission is granted for members of ; Usenet & Arpanet to use this program. ; It is NOT to be distrk}ibuted beyond ; Usenet & Arpanet sites; sold, or traded ; without consent of the author. SET $E = $4000 SET $491 = $4000 l}DEFINE RW = "12" BYTE RAMSIZ = $2E4, RAMTOP = $6A PROC main() Close(7) Close(0) RAMSIZ = $C0 RAMTOP = $C0 Open(m}0,"E:",RW,0) RETURN TE RAMSIZ = $2E4, RAMTOP = $6A PROC main() Close(7) Close(0) RAMSIZ = $C0 RAMTOP = $C0 Open( Copyright (c) 1986, Paul van de Graaf Permission is granted for Usenet & Arpanet users to copy this article for their own u o}se. It is NOT to be distributed beyond Usenet & Arpanet sites (or normal tributaries thereof); sold, or traded without permi p}ssion from the author. [ The reason for the above notice is that I am considering getting this article and programs publis q}hed in either Analog or Antic. I recently had my printer and modem destroyed by a power-surge, and could use some cash to r}replace them. ( I accidently plugged them into my un-surge-protected power strip. BLAST! ) Consider this a Beta-Test of t s}he article & programs. They will either be published in another form, or released into the public domain. I would esp t}ecially like to keep them off of Compuserve et al., for the time being. ] Here's the program you Action! programmers have u}all been waiting for! A free Run-Time Library of sorts for the Action! language. But first a few disclaimers: 1.) This run-t v}ime library requires at least 48K of memory. It will not run when cartridges are installed, as it uses memory from $A000 w} to $B5FF. 2.) The library has only been tested for version 3.6 of the Action! cartridge. To find out which version you x}have, check location $B000. It contains the version number in hex. If it's not $36, then the library might not work y}. I'd try it anyway, since it might work, or there probably is an easy patch. See the text below for more details. 3.) z} Since this library requires that you make a copy of part of the Action! cartridge, there may be some issue of piracy. I {} consider this a legal back-up copy of the cartridge as stated in the licensing agreement, but OSS's attorneys might |}think otherwise. Proceed at your own risk! I take no legal responsibility for your actions. 4.) Because the routines Pr }}intF() and Error() have some bank-switching in them, they do not work normally. PrintF() works fine, except when asked t ~}o print CARDs in hex, it prints them in decimal. [ie. PrintF("%H",foo)] FIXACT.ACT changes the PrintF routine to mak }e it act this way, otherwise it would lock up, since it tries to call bank-switched code. I personally never cared f }or this routine anyway, because it always prints a leading "$", and you can't get it to suppress leading zeros. I'm sure } you could write a better PrintF() yourself. The Error() routine works about the same as before, but instead of retu }rning to the monitor after an error, it returns to DOS. Introduction: I wrote this library, because I can't understand }why OSS decided not to include a run-time library with the Action! system. The run-time library routines are only about 2K o }f the cartridge. They could have easily made some facility to link the routines into the code. Perhaps they were short on s }pace in the cartridge, or maybe this is some marketing ploy to sell run-time library disks. I haven't seen or heard any detai }ls on the run-time library disk, other than you can get one for $30.00. I'm sure their library is a much more elegant, as I }went the quick and dirty route. Instead of writing a full-blown linker and relocator to link in the run-time library, I opte }d for a simpler approach. How it works: My home-brew run-time library consists of 4 programs: RTL.ACT Sets up me }mory for the run-time library. ACTION.COM A copy of part of the Action! cartridge saved to a binary file. FIXACT.ACT } Fixes the self-modifying and bank-switching code in ACTION.COM CLEANUP.ACT Cleans up after the run-time library. The l }ibrary works like this: RTL.ACT is run first. It is a one-shot program which makes your 48K or greater machine look like a }40K computer by closing the editor, bumping down RAMTOP, and opening the editor again. It also sets up the error handler, an }d opens the keyboard as channel 7. Channel 7 is opened because the Action! cartridge keeps channel 7 open all the time, and }some programs take advantage of this channel. After RTL.ACT is run, ACTION.COM is loaded, and the run-time library is in pla }ce. It's as if the cartridge is inserted, except this cartridge can be written to and can't do bank-switching. After ACTION. }COM is loaded, a compiled Action! program can be run, and it will call the library routines that were normally on the cartrid }ge, but now have been copied and loaded into RAM. After the compiled Action! program is run, you have the option of running }CLEANUP.ACT to reset the machine so it looks like it has 48K of memory again. There's just one problem, though. The Action }! cartridge has some self-modifying code in it that can alter the routines in the run-time library as it runs. It works fine } when it's in a ROM cartridge, but it gets messed up when in RAM. This code was put in to make life difficult for pirates who } might be considering ripping-off the Action! cartridge. I took a disassembler to ACTION.COM and I'm fairly certain I've loc }ated all the self-modifying code. While disassembling I also located the bank-switching code mentioned above. FIXACT.ACT re }places the tainted code with NOPs, thereby de-fusing the logic bombs. Contrary to what you might expect, you CAN write progr }ams in Action! that will run without the run-time library. You can't call any library routines, do a multiply, divide, MOD, }RSH, or LSH; use the trace or error facilities, or have a PROC/FUNC that has more than 3 bytes of parameters. These constrai }nts make programming difficult, but not impossible. RTL.ACT is written in this manner. It uses CIO calls to do opens, close }s and puts to IO channels, rather than calling the run-time library routines. Dim the lights, it's time for the sermon: I } believe it's important to mention the distinction between what I'm doing here, and piracy. I am only making a backup of the } cartridge, and this backup is taking the place of the cartridge when I want to run a program without the cartridge inserted. } If the Action! system were better designed, I needn't bother with this. I don't think this constitutes piracy unless I giv }e/sell a copy of the cartridge to somebody, or use it on a different computer. I only give the patches to fix code in the ru }n-time library in FIXACT.COM-- NOT for the editor, monitor, or compiler sections of the cartridge. In fact after looking at }most of the code in the Action! cartridge, I would guess any effort to pirate the cartridge, other than building a similar ba }nk-switching arrangement, would greatly reduce the functionality of Action!. Besides-- you can get it for $29.00 at some mai }l-order shops. Despite their mistake with the run-time library for Action!, OSS is a quality software vendor, and they deser }ve our support. Making the run-time library: Step 1: Go to DOS with the Action! cartridge installed. Select the K comma }nd to write a binary file. At the prompt: SAVE - GIVE FILE,START,END,(INIT,LOAD) type: ACTION.COM,A000,B5FF } Step 2: Compile RTL.ACT, and from the monitor type: W "RTL.COM" Compile FIXACT.ACT, and from the monitor type: }W "FIXACT.COM" Compile CLEANUP.ACT, and from the monitor type: W "CLEANUP.COM" Step 3: Remove the Action! cartridge an }d re-boot the system. (on the XL & XE be sure to press the Option key when booting) Select the L command from the DOS men }u to load a binary file. At the prompt: LOAD FROM WHAT FILE? type: RTL.COM The screen will clear, and you'll return to } DOS. DOS gets confused because the screen was cleared and the cursor was moved. Press return, and DOS will redraw the }menu and come back to its senses. Select the L command again. At the prompt: LOAD FROM WHAT FILE? type: ACTION.COM A }fter the file has loaded, select the L command again. At the prompt: LOAD FROM WHAT FILE? type: FIXACT.COM After the f }ile loads and runs, select the K (binary save) command. At the prompt: SAVE - GIVE FILE,START,END,(INIT,RUN) type: }ACTION.COM,A000,B5FF Three ways to use the run-time library: 1.) Manually: Boot DOS without any cartridges installed ( }press option while booting on an XL or XE). Load RTL.COM from DOS, then load ACTION.COM from DOS, and finally load the c }ompiled Action! program you wish to run. This is rather tedious process, but it's ideal for quickly testing the run-time l }ibrary. 2.) With an AUTORUN.SYS file: Make a compound binary load file from DOS. Select the C command and at the promp }t: COPY--FROM,TO? type: ACTION.COM,RTL.COM/A This will append ACTION.COM to the end of RTL.COM. When loaded with the }L command, RTL.COM will now run the old RTL.COM program, and then load ACTION.COM. If you rename RTL.COM as AUTORUN.SYS, t }his process will automatically occur at boot time. After the boot, you can load compiled Action! files from DOS, and the }y should run properly. You probably would want to use this technique if you have a bunch of compiled Action! programs on } the same disk. 3.) A fully linked file: Take a file like the AUTORUN.SYS file above, and append your compiled Action! }program to it. IE. choose the C command from DOS, and type "YOUR_PROGAM.COM, AUTORUN.SYS/A" at the prompt. If you want to } have the run-time library clean up after itself when your program returns to DOS, you'll also want to append the CLEANUP }.COM file too. IE. "C(opy) CLEANUP.COM,AUTORUN.SYS/A". You might want to change the name of the file to something other t }han AUTORUN.SYS, if you don't want it to run automatically at boot time. This technique has a disadvantage -- after all }that appending, the load file gets quite large! I have tried to pare the size down a little by only saving part of the Acti }on! cartridge. Still, the ACTION.COM file is much larger than the 2K of routines we need. The problem is that the run-t }ime library is scattered throughout the address space of the cartridge, and it's too much trouble to save it in several }fragmented files. If it doesn't work: If the run-time library doesn't run correctly, make sure you didn't make an err }or along the way. If you don't have version 3.6, try saving all of the cartridge in steps 1 & 3 (ie. K "ACTION.COM,A000,BF }FF"). Your cartridge may use code in the $B600 - $BFFF area. If the library still doesn't work, try skipping the L "FIX }ACT.COM" step. It should probably work now, but ACTION.COM will likely contain self-modifying and bank-switching code. Yo }u're going to have to take a disassembler to ACTION.COM to ferret out the self-modifying and bank-switching code. Then y }ou can bypass the code with NOPs. Self modifying code is fairly easy to identify. It's usually something obvious like: } "DEC $A000,X", however it might be some sort of manipulation of a variable like: "LDA #0; STA $A0; LDA #$A0; STA $A1; INC } ($A0),X". Bank-switching code is very easy to spot. It involves a write to any address from $D500 - $D5FF. For example }: STA $D509,X. You can find the entry points for most of the library routines by using the monitor. ex. ? PrintF. A }few routines can't be found this way. They are: the math routines: MULTIPLY, DIVIDE, MOD, LSH, RSH; a routine which saves } parameters and checks for a break key abort when PROCs or FUNCs with more than 3 bytes of parameters are called, and a rou }tine to print a PROC/FUNC name and its arguments when trace is set. The way I found the entry points to these routines w }as to disassemble a compiled Action! programs which called these routines. Good Luck! Please send me mail if you find a p }atch to FIXACT.ACT which works for your version. And now the programs: After all this build-up, the programs are probably } a let-down. They're quite straight-forward if you know the CIO routine. If you don't, you might want to get the technical }notes from Atari (if they still sell them!). It probably will be easier to down-load them in one big file, and then hack it } to pieces with the Action! editor. I'd like to know if this library works with the other versions of the Action! cartridge. } Send me mail if it works with your version. Thanks, Paul van de Graaf sdcsvax!sdcc6!sdcc12!wa60 U. C. San Diego ge. z PROC _CPYPRM=*() SET $4EE = _CPYPRM [$85$A0$86$A1$84$A2$18$68$85$84$69$03 $A8$68$85$85$69$00$48$98$48$A0$01$B1 $84$85$82$C8}$B1$84$85$83$C8$B1$84$A8 $B9$A0$00$91$82$88$10$F8$60] PROC _CHGSGN=*() [$85$C0$86$C1$38$A9$00$E5$C0$48$A9$00 $E5$C1$AA$68$6}0] PROC _FIXSGN=*() [$86$C2$E0$00$10$03$20 _CHGSGN $85$82 $86$83$A5$85$45$C2$85$C2$A6$85$10$09 $A5$84$20 _CHGSGN $85$84$86$}85$60] PROC _FIXRES=*() [$A5$86$A6$87$A4$C2$10$03$4C _CHGSGN $60] PROC _MUL=*() SET $4E8 = _MUL [$20 _FIXSGN $A9$00$85$86}$85$87$A5$82 $D0$04$A5$83$F0$22$A5$84$D0$04$A5$85 $F0$1A$46$85$66$84$90$0D$18$A5$86$65 $82$85$86$A5$87$65$83$85$87$06$82$26 $}83$38$B0$D6$4C _FIXRES] PROC _DIV=*() SET $4EA = _DIV [$20 _FIXSGN $A9$00$85$86$85$87$85$C1 $A9$01$85$C0$A5$82$D0$04$A5$83$}F0$5F $A5$84$D0$04$A5$85$F0$57$A5$82$C5$84 $A5$83$E5$85$90$0F$A5$C1$30$0B$06$84 $26$85$06$C0$26$C1$38$B0$E7$A5$C0$D0 $04$A5$C}1$F0$36$A5$82$D0$04$A5$83$F0 $2E$A5$82$C5$84$A5$83$E5$85$90$19$38 $A5$82$E5$84$85$82$A5$83$E5$85$85$83 $A5$86$05$C0$85$86$A5$}87$05$C1$85$87 $46$85$66$84$46$C1$66$C0$38$B0$C2$4C _FIXRES] PROC _MODOP=*() SET $4EC = _MODOP [$20 _DIV $A5$82$A6$83$60] } PROC _RSHOP=*() SET $4E6 = _RSHOP [$A4$84$F0$0A$86$86$46$86$6A$88$D0$FA $A6$86$60] PROC _LSHOP=*() SET $4E4 = _LSHOP [$A4$}84$F0$0A$86$86$0A$26$86$88$D0$FA $A6$86$60] PROC _ERROU=*() [$A9$70$AA$A9$0C$9D$42$03$20$56$E4$8A $38$E9$10$D0$F1$6C$0A$00]} PROC _ERRVEC=*() [_ERROU] PROC _DEVIC=*() [$00] MODULE CARD Error=_ERRVEC BYTE device=_DEVIC PROC _GOCIO=*() [$20$56$E}4$10$1A$C0$88$F0$06$68$68$98 $6C _ERRVEC $48$8A$48$4A$4A$4A$4A$AA $A9$01$9D$C0$05$68$AA$68$60] PROC _LODCHN=*() [$C9$08$90$}07$68$68$A9$86$6C _ERRVEC $0A$0A$0A$0A$AA$60] PROC _STONAM=*() [$18$69$01$9D$44$03$98$69$00$9D$45$03 $60] PROC _SHFTR=*()} [$48$8A$A8$68$AA$AD _DEVIC $60] PROC _CLREOL=*() [$48$A9$00$85$A5$68$60] PROC _SETEOL=*() [$48$A9$01$85$A5$68$60] PROC} _PRECON=*() [$8A$48$98$AA$68$A0$03$84$A3$A0$FD$60] PROC _DOPRNT=*() [$86$A3$84$A4$20 _LODCHN $A9$00$9D$49 $03$A8$B1$A3$F0$}1A$9D$48$03$18$A5$A3 $69$01$9D$44$03$A5$A4$69$00$9D$45$03 $A9$0B$9D$42$03$20 _GOCIO $A5$A5$F0 $12$A9$00$9D$48$03$9D$49$03$A9$}0B$9D $42$03$A9$9B$20 _GOCIO $60] PROC StrC=*(CARD c, s) [$85$D4$86$D5$84$A2$20$AA$D9$20$E6$D8 $A0$00$B1$F3$30$06$C8$91$A2$}38$B0$F6 $29$7F$C8$91$A2$98$A0$00$91$A2$60] PROC StrB=*(BYTE b CARD s) [$84$A3$48$8A$A8$A2$00$68$4C StrC] PROC StrI=*(INT} i CARD s) [$E0$00$30$03$4C StrC $49$FF$85$A2 $8A$49$FF$AA$E6$A2$D0$01$E8$A5$A2$20 StrC $A0$00$18$B1$A2$69$01$91$A2$A8 $88$}B1$A2$C8$91$A2$88$88$D0$F7$C8$A9 $2D$91$A2$60] PROC _DOPRNC=*() [$48$20 _PRECON $20 StrC $68$A2$FD$A0 $03$4C _DOPRNT] PRO}C DOPRNI=*() [$48$20 _PRECON $20 StrI $68$A2$FD$A0 $03$4C _DOPRNT] PROC PrintCD=*(BYTE d CARD c) [$20 _CLREOL $4C _DOPRNC] } PROC PrintC=*(CARD c) [$20 _SHFTR $4C PrintCD] PROC PrintCDE=*(BYTE d CARD c) [$20 _SETEOL $4C _DOPRNC] PROC PrintCE=*(}CARD c) [$20 _SHFTR $4C PrintCDE] PROC PrintBD=*(BYTE d, b) [$A0$00$4C PrintCD] PROC PrintB=*(BYTE b) [$20 _SHFTR $4C Pri}ntBD] PROC PrintBDE=*(BYTE d, b) [$A0$00$4C PrintCDE] PROC PrintBE=*(BYTE b) [$20 _SHFTR $4C PrintBDE] PROC PrintID=*(B}YTE d INT i) [$20 _CLREOL $4C _DOPRNI] PROC PrintI=*(INT i) [$20 _SHFTR $4C PrintID] PROC PrintIDE=*(BYTE d INT i) [$20 _}SETEOL $4C _DOPRNI] PROC PrintIE=*(INT i) [$20 _SHFTR $4C PrintIDE] PROC PrintD=*(BYTE d CARD s) [$20 _CLREOL $4C _DOPRNT}] PROC Print=*(CARD s) [$20 _SHFTR $4C PrintD] PROC PrintDE=*(BYTE d CARD s) [$20 _SETEOL $4C _DOPRNT] PROC PrintE=*(CA}RD s) [$20 _SHFTR $4C PrintDE] PROC _HEXSTR=*() [$85$84$86$85$A9$FD$85$A2$A9$03$85$A3 $A0$00$A9$05$91$A2$C8$A9$24$91$A2$A9 }$00$A2$04$06$84$26$85$2A$CA$D0$F8$69 $30$C9$3A$90$02$69$06$C8$91$A2$C0$05 $D0$E5$60] PROC PrintF=*(CARD s,a,b,c,d,e,f,g) [$}85$82$86$83$84$A2$AD _DEVIC $0A$0A $0A$0A$85$C1$A0$00$84$87$84$C0$B1$82 $F0$4C$85$86$E6$C0$F0$46$A4$C0$C4$86 $F0$02$B0$3E$B1$}82$C9$25$D0$3E$E6$C0 $C8$C4$86$F0$02$B0$35$B1$82$C9$25$F0 $2F$C9$45$F0$29$A8$A6$87$E0$0E$B0$D4 $B5$A2$48$B5$A3$E8$E8$86$87$AA}$68$C0 $43$F0$15$C0$49$F0$34$C0$48$F0$3C$C0 $53$F0$3F$38$B0$1D$60$38$B0$B2$A9$9B $A8$A6$C1$A9$00$9D$48$03$9D$49$03$A9 $0B$9D$}42$03$98$20 _GOCIO $38$B0$E4 $A0$03$84$A3$A0$FD$20 StrC $38$B0$0F $A0$03$84$A3$A0$FD$20 StrI $38$B0$03 $20 _HEXSTR $A9$FD$A2$}03$85$84$86$85 $A6$C1$A9$00$9D$49$03$A8$B1$84$F0$B5 $9D$48$03$18$A5$84$69$01$9D$44$03$A5 $85$69$00$9D$45$03$A9$0B$9D$42$03$20} _GOCIO $38$B0$98] PROC PutD=*(BYTE d, c) [$86$A0$20 _LODCHN $A9$00$9D$48$03$9D $49$03$A9$0B$9D$42$03$A5$A0$20 _GOCIO $60] } PROC PutDE=*(BYTE d) [$A2$9B$4C PutD] PROC Put=*(BYTE c) [$AA$AD _DEVIC $4C PutD] PROC PutE=*() [$A9$9B$4C Put] BYTE }FUNC ValB=*(CARD a) CARD FUNC ValC=*(CARD a) INT FUNC ValI=*(CARD a) [$85$A2$86$A3$A9$00$85$A0$85$A1$85$A5 $A8$B1$A2$85$A4$C8}$B1$A2$C9$20$F0$F9 $C9$2D$D0$0B$C6$A5$C8$C4$A4$F0$02$B0 $31$B1$A2$38$E9$30$90$2A$C9$0A$B0$26 $48$06$A0$26$A1$A5$A0$A6$A1$0A$2}6$A1 $0A$26$A1$18$65$A0$85$A0$8A$65$A1$85 $A1$18$68$65$A0$85$A0$90$CD$E6$A1$38 $B0$C8$A5$A5$F0$0D$38$A9$00$E5$A0$85 $A0$A9$00}$E5$A1$85$A1$60] PROC _DOINPT=*() [$86$A4$84$A5$20 _LODCHN $18$A5$A4$69 $01$9D$44$03$A5$A5$69$00$9D$45$03$A5 $A3$F0$18$9D$4}8$03$A9$00$9D$49$03$A9 $05$9D$42$03$20 _GOCIO $BD$48$03$F0 $03$38$E9$01$A0$00$91$A4$A5$A6$F0$07 $A5$A4$A6$A5$4C ValC $60] B}YTE FUNC InputBD=*(BYTE d) CARD FUNC InputCD=*(BYTE d) INT FUNC InputID=*(BYTE d) [$48$A9$78$85$A3$A9$01$85$A6$68$A2$FD $A0$0}3$4C _DOINPT] BYTE FUNC InputB=*() CARD FUNC InputC=*() INT FUNC InputI=*() [$AD _DEVIC$4C InputCD] PROC InputMD=*(BYTE d} CARD s BYTE l) [$48$A9$00$85$A6$68$4C _DOINPT] PROC InputSD=*(BYTE d CARD s) [$48$A9$FF$85$A3$68$4C InputMD] PROC InputS}=*(CARD s) [$20 _SHFTR $4C InputSD] CHAR FUNC GetD=*(BYTE d) [$20 _LODCHN $A9$00$9D$48$03 $9D$49$03$A9$07$9D$42$03$20 _GOCI}O $85$A0$60] PROC Open=*(BYTE d CARD s BYTE m, a) [$86$A1$20 _LODCHN $A5$A1$20 _STONAM $A5$A3$9D$4A$03$A5$A4$9D$4B $03$A9$}03$9D$42$03$20 _GOCIO $8A$4A $4A$4A$4A$AA$A9$00$9D$C0$05$60] PROC Close=*(BYTE d) [$20 _LODCHN $A9$0C$9D$42$03$20 _GOCIO $6}0] PROC XIO=*(BYTE d,z,c,a1,a2 CARD s) [$20 _LODCHN $98$9D$42$03$A5$A3$9D$4A $03$A5$A4$9D$4B$03$A5$A5$A4$A6$20 _STONAM $20 }_GOCIO $60] PROC Note=*(BYTE d CARD s, o) [$86$A1$84$A2$20 _LODCHN $A9$26$9D$42 $03$20 _GOCIO $A0$00$BD$4C$03$91$A1 $BD$4E$}03$91$A3$BD$4D$03$C8$91$A1$60] PROC Point=*(BYTE d CARD s BYTE o) [$86$A1$20 _LODCHN $A5$A1$9D$4C$03$98 $9D$4D$03$A5$A3$9D$}4E$03$A9$25$9D$42 $03$20 _GOCIO $60] PROC Graphics=*(BYTE m) [$48$A2$60$A9$0C$9D$42$03$20$56$E4$68 $9D$4B$03$49$10$09$0C$9D}$4A$03$A9$53 $85$A0$A9$3A$85$A1$A9$A0$9D$44$03$A9 $00$9D$45$03$A9$03$9D$42$03$20 _GOCIO $60] PROC SetColor=*(BYTE r, h, l) }[$C9$05$B0$13$85$A0$8A$0A$0A$0A$0A$85 $A1$98$29$0F$05$A1$A6$A0$9D$C4$02$60] PROC Position=*(CARD x BYTE y) [$85$55$86$56$84}$54$60] PROC Plot=*(CARD x BYTE y) [$20 Position $A9$06$AE$FD$02$4C PutD] PROC DrawTo=*(CARD x BYTE y) [$20 Position $A2$}60$A9$11 $9D$42$03$AD$FB$02$8D$FD$02$20 _GOCIO $60] PROC Fill=*(CARD x BYTE y) [$20 Position $A2$60$A9$12 $9D$42$03$AD$FB$0}2$8D$FD$02$20 _GOCIO $60] BYTE FUNC Locate=*(CARD x BYTE y) [$20 Position $A9$06$4C GetD] PROC Sound=*(BYTE c, p, d, v) [ }$C9$04$B0$25$86$A1$0A$AA$A9$00$8D$08 $D2$A9$03$8D$0F$D2$A5$A3$29$0F$85$A3 $98$29$0E$0A$0A$0A$0A$05$A3$9D$01$D2 $A5$A1$9D$00$D }2$60] PROC SndRst=*() [$A9$00$A2$07$9D$00$D2$CA$10$FA$60] BYTE FUNC Paddle=*(BYTE p) [$29$07$AA$BD$70$02$85$A0$60] BYTE } FUNC PTrig=*(BYTE p) [$29$07$AA$BD$7C$02$85$A0$60] BYTE FUNC Stick=*(BYTE p) [$29$03$AA$BD$78$02$85$A0$60] BYTE FUNC STr }ig=*(BYTE p) [$29$03$AA$BD$84$02$85$A0$60] INT FUNC SCompare=*(CARD s1, s2) [$85$A4$86$A5$84$A2$A0$00$84$A0$84$A1 $B1$A4$85 }$A6$B1$A2$85$A7$C4$A6$F0$15 $C4$A7$F0$11$C8$B1$A4$D1$A2$F0$F1$90 $03$E6$A0$60$C6$A0$C6$A1$60$A5$A6$C5 $A7$F0$F9$B0$F0$90$F1] } PROC SCopy=*(CARD d, s) [$85$A0$86$A1$84$A2$A0$00$B1$A2$A8$B1 $A2$91$A0$C0$00$F0$04$88$38$B0$F4$60] PROC SCopyS=*(CARD d,} s BYTE b, e) [$85$A0$86$A1$84$A2$A0$00$84$A6$B1$A2 $C5$A5$B0$02$85$A5$A5$A4$F0$15$C5$A5 $F0$02$B0$0F$A4$A4$E6$A4$B1$A2$E6$A6} $A4$A6$91$A0$38$B0$E7$A5$A6$A0$00$91 $A0$60] PROC SAssign=*(CARD d, s BYTE b, e) [$85$A0$86$A1$84$A2$A5$A4$F0$3B$C5$A5 $F0}$02$B0$35$85$A7$C6$A7$A0$00$84$A8 $B1$A0$85$A9$B1$A2$85$AA$A5$A7$C5$A5 $B0$15$A5$A8$C5$AA$B0$0F$E6$A8$A4$A8 $B1$A2$E6$A7$A4$A}7$91$A0$38$B0$E5$A5 $A7$C5$A9$90$04$A0$00$91$A0$60] BYTE FUNC Rand=*(BYTE r) [$85$A2$C6$A2$A9$01$C5$A2$B0$05$38$2A $38$B0$F}7$85$A3$AD$0A$D2$25$A3$C5$A2 $F0$04$90$02$B0$F3$85$A0$60] PROC Poke=*(CARD a BYTE v) [$85$A0$86$A1$98$A0$00$91$A0$60] PRO}C PokeC=*(CARD a, v) [$20 Poke $C8$A5$A3$91$A0$60] BYTE FUNC Peek=*(CARD a) CARD FUNC PeekC=*(CARD a) [$85$A2$86$A3$A0$00$B}1$A2$85$A0$C8$B1 $A2$85$A1$60] PROC SetBlock=*(CARD a, l, v) [$85$A0$86$A1$84$A2$A0$00$A5$A2$D0$04 $A5$A3$F0$16$A5$A4$91$A0}$C8$D0$02$E6 $A1$C6$A2$A5$A2$C9$FF$D0$E7$C6$A3$38 $B0$E2$60] PROC Zero=*(CARD a, l) [$48$A9$00$85$A4$68$4C SetBlock] PROC} MoveBlock=*(CARD d, s, l) [$85$A0$86$A1$84$A2$A0$00$A5$A4$D0$04 $A5$A5$F0$18$B1$A2$91$A0$C8$D0$04$E6 $A1$E6$A3$C6$A4$A5$A4$C}9$FF$D0$E5$C6 $A5$38$B0$E0$60] MODULE 84$A2$A0$00$A5$A4$D0$04 $A5$A5$F0$18$B1$A2$91$A0$C8$D0$04$E6 $A1$E6$A3$C6$A4$A5$A4$C) Here is Jeff Reister's PD Runtime package for the Action! 8 bit language. To use it in the simplest form, simply add to }the beginning of your Action! program the line INCLUDE "D:RUNTIME.ACT" and compile as normal. If the compile is su}ccessful, the resulting file can be run as a binary file (No Action! cartridge necessary). Additional programs not incl}uded here because they are binaries: RTSCAN.COM - run against your source file to produce a listing } showing which RUNTIME.ACT routines are actually required by your program. Allows you to trim out unn}eeded routines to save symbol table space, etc. RTWRITE.COM - If you send the output from RTSCAN.}COM to a disk file, you can then run RTWRITE on that file -- it in turn outputs the } trimmed down version of RUNTIME.ACT for you. These should be available from any respectable Atari!} club library. Of course, you don't need them for most programs, just include the full RUNTIME.ACT and don't get fancy. The"} whole works is on the computer services GEnie, Delphi, Compuserve. include the full RUNTIME.ACT and don't get fancy. TheFB%DOS SYSB*)DUP SYSBSACTRTL ACTBbnACTRTL DOCBIACTRUN ACTB ACTRUN DOC